import core from '@/core'
import get from './get'
import {getResult, getError} from '../handle'
import {handleWhere, handleUpdate} from '../../sync/'

/**
 * 修改的逻辑
 * 修改的参数内不能含有_id
 * 修改的同时要记录修改信息
 * 
 * cloudObj.collection：是否已有固定的操作对象了。该操作对象必须依赖于doc
 * 返回值，默认不返回修改后的数据。如果需返回修改后的数据，需要查询数据库（field参数将生效）
 */
module.exports = (cloudObj, params, config = {}, isApp = true) => {
	return new Promise((resolve, reject) => {
		/**
		 * 用于修正批量修改的bug：批量修改的场景下，每次查询有上限500或者1000条，也是批量修改的上限。还未完成
		 * 思路：
		 * isBatch：表示要批量修改，有可能是大数据时为true，则给添加pagination
		 * 先通过既定的参数查询数量，然后根据查询到的数量以及pageSize计算需要查询的次数 - 未落实，等有实际场景时再落实吧
		 * 每次修改完后再继续下一个循环，直到结束
		 */
		if (params.isBatch) {
			const pagination = {
				pageIndex: 0, pageSize: 500
			}
			params.pagination = pagination
			delete params.isBatch
		}
		const {isReturn, data} = params
		var db
		if (cloudObj.collection) {
			if (params.doc || params._id) {
				var id = params.doc || params._id
				if (typeof(id) === 'string') {
					db = cloudObj.collection.doc(id)
				}
			}
		}
		if (!db) {
			db = handleWhere(cloudObj, params, config, isApp)
		}
		if (db) {
			delete data._id // 一定要清除修改数据的id
			data.alert_time = common.startTime
			data.alert_user = common.necessary.User
			// 记录修改信息。前端不支持复杂修改
			if (isApp) {
				data.HISTORY = [JSON.parse(JSON.stringify(data))]
				data.HISTORY[0].isApp = true
			} else {
				data.HISTORY = {
					updateType: 'unshift',
					update: [JSON.parse(JSON.stringify(data))]
				}
			}
			Object.keys(data).forEach(key => {
				handleUpdate(key, data, cloudObj.db)
			})
			/**
			 * 关于updateAndReturn的官方说明
			 * 使用updateAndReturn时，不可使用field方法
				可以在事务中使用，可以使用transaction.where().updateAndReturn()以及transaction.doc().updateAndReturn()
				不同于update接口，此接口返回的updated不表示数据真的进行了更新
				腾讯云暂不支持doc().updateAndReturn()的写法可以使用where().updateAndReturn()替代
				
				经实测，至少在支付宝云不支持updateAndReturn!!。如果要返回数据，方案：
				先查询这些要修改的数据，然后修改，修改后，直接改查询后的数据返回。但是遇到特殊类型updateType无法处理。优化方案：
				先修改，修改完毕之后再查询
			 */
			db.update(data).then(res => {
				if (res.result) {
					res = JSON.parse(JSON.stringify(res.result))
				}
				const {updated, doc} = res
				res.message = `修改${updated}条成功`
				const success = (data) => {
					res.data = data
					resolve(getResult(res))
				}
				if (updated) {
					if (isReturn) {
						get(cloudObj, {doc}, config, isApp).then(res => {
							if (res.result) {
								res = JSON.parse(JSON.stringify(res.result))
							}
							if (res.data.length > 0) {
								success(res.data)
							} else {
								success()
							}
						}).catch(err => {
							success()
						})
					} else {
						success()
					}
				} else {
					success()
				}
			}).catch(reject)
		}
	})
}